import { ElMessage } from "element-plus";

class Message {
  /**
   * 内部：解析容器
   * @param {String|Element} container
   * @returns {Element|null}
   */
  #resolveContainer = container => {
    if (!container) return null;
    if (typeof container === "string") return document.querySelector(container);
    if (container instanceof Element) return container;
    return null;
  };

  /**
   * 默认 Message 消息提示
   * @param {String} type 消息类型 primary、success、 warning、info、error
   * @param {String} message 消息内容
   * @param {Object} options 配置项
   * @returns {Object} 返回一个 Message 实例
   */
  baseMessage = (type, message, options = {}) => {
    if (options.container) options.container = this.#resolveContainer(options.container);
    return ElMessage({
      type,
      message,
      appendTo: options.container || document.body,
      duration: options.duration ?? 2000,
      customClass: options.container instanceof Element ? "toast-part" : "toast-global", // 你的自定义 class 默认全局 class
      ...options,
    });
  };

  /**
   * 主要消息提示
   * @param {String} msg 消息内容
   * @param {Object} options 配置项
   * @returns {Object} 返回一个 Message 实例
   */
  primary = (msg, options) => this.baseMessage("primary", msg, options);

  /**
   * 成功消息提示
   * @param {String} msg 消息内容
   * @param {Object} options 配置项
   * @returns {Object} 返回一个 Message 实例
   */
  success = (msg, options) => this.baseMessage("success", msg, options);

  /**
   * 警告消息提示
   * @param {String} msg 消息内容
   * @param {Object} options 配置项
   * @returns {Object} 返回一个 Message 实例
   */
  warning = (msg, options) => this.baseMessage("warning", msg, options);

  /**
   * 信息消息提示
   * @param {String} msg 消息内容
   * @param {Object} options 配置项
   * @returns {Object} 返回一个 Message 实例
   */
  info = (msg, options) => this.baseMessage("info", msg, options);

  /**
   * 错误消息提示
   * @param {String} msg 消息内容
   * @param {Object} options 配置项
   * @returns {Object} 返回一个 Message 实例
   */
  error = (msg, options) => this.baseMessage("error", msg, options);
}

/**
 * 作为插件全局挂载
 * @param {Object} app Vue 应用实例
 * @returns {void}
 */
export default {
  install(app) {
    // 创建消息实例
    const msgInstance = new Message();
    // 创建一个可调用的函数，默认调用 info 方法
    const $msg = options => msgInstance.baseMessage(options.type, options.message, options);
    // 将 Message 实例上的其他方法附加到 $msg 函数上
    $msg.primary = msgInstance.primary;
    $msg.success = msgInstance.success;
    $msg.warning = msgInstance.warning;
    $msg.info = msgInstance.info;
    $msg.error = msgInstance.error;
    // 挂载到 Vue 实例
    app.config.globalProperties.$msg = $msg;
    // 可选：挂到 window 方便在非组件场景快速用
    if (typeof window !== "undefined") {
      window.$msg = $msg;
    }
  },
};
